home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
A Teacher's Guide to the Holocaust
/
A Teacher's Guide to the Holocaust.iso
/
data
/
timeline
/
scripts
/
elemdragclass.js
< prev
next >
Wrap
Text File
|
2000-06-26
|
11KB
|
359 lines
// Copyright 1998,1999 Macromedia, Inc. All rights reserved.
//Constructs a drag and drop element
function MM_drag(theParent, theName, theInitialValue,
theIsDraggable, theIsTarget,
theSnapsOnMiss, theSnapsOnIncorrect) {
// properties
this.initialValue = theInitialValue;
this.value = '';
this.disabled = true;
this.snapsOnMiss = theSnapsOnMiss;
this.snapsOnIncorrect = theSnapsOnIncorrect;
this.origPosX = '';
this.origPosY = '';
this._parent = theParent;
this._name = theName;
this._obj = '';
this._self = theParent._self+".e['"+theName+"']";
this._singleChoice = true;
this._isDraggable = theIsDraggable;
this._isTarget = theIsTarget;
this._posX = '';
this._posY = '';
this._prevPosX = '';
this._prevPosY = '';
this._width = '';
this._height = '';
this.c = new Array();
// member functions
this.init = MM_dragInit;
this.reset = MM_dragReset;
this.enable = MM_dragEnable;
this.disable = MM_dragDisable;
this.setDisabled = MM_dragSetDisabled;
this.update = MM_dragUpdate;
this.getPosition = MM_dragGetPosition;
this.snapTo = MM_dragSnapTo;
this.snapBack = MM_dragSnapBack;
this.moveToFront = MM_dragMoveToFront;
this.updateValue = MM_dragUpdateValue;
this.updateSources = MM_dragUpdateSources;
this.changeValue = MM_dragChangeValue;
this.setValue = MM_dragSetValue;
}
//Called to initialize the drag objects
function MM_dragInit() {
with (this) {
_obj = MM_intFindObject(_parent._self + _name);
if (_obj) {
_width = parseInt((_parent.browserIsNS)?_obj.clip.width:_obj.offsetWidth);
_height = parseInt((_parent.browserIsNS)?_obj.clip.height:_obj.offsetHeight);
getPosition();
origPosX = _posX; origPosY = _posY;
if (_isDraggable)
MM_dragLayer(_parent._self + _name,'',0,0,0,0,true,false,-1,-1,-1,-1,false,false,0,_self+'.update()',true,_self+'.update(true)');
} }
}
//Resets the element and its choices
function MM_dragReset() {
var i;
if (this._obj) with (this) {
_parent.disabled ? disable() : enable();
value = initialValue;
if (_isDraggable) {
if (!changeValue(value)) {
snapTo(origPosX, origPosY);
updateValue(true);
updateSources();
} } }
}
//Enables the element
function MM_dragEnable() {
var i;
if (this._obj) with (this) {
disabled = false;
for (i in c) if (i != 'length') c[i].disabled = false;
updateValue(true);
if (_isDraggable) _obj.MM_dragOk = true;
}
}
//Disables the element
function MM_dragDisable() {
with (this) {
disabled = true;
if (_isDraggable && _obj) _obj.MM_dragOk = null;
}
}
//Calls the approppriate disable or enable function
function MM_dragSetDisabled(theDisabled) {
if (theDisabled) this.disable();
else this.enable();
}
//Called by MM_dragLayer when a drag object is dropped
// Do a hit test on each of the targets
function MM_dragUpdate(dragging) {
var i,noJudge=false,origValue,x,y;
with (this) {
if (dragging) {
if (this.onDrag != null) {
x = parseInt((_parent.browserIsNS)?_obj.pageX:_obj.style.pixelLeft);
y = parseInt((_parent.browserIsNS)?_obj.pageY:_obj.style.pixelTop);
onDrag(_parent._self+_name, x, y);
}
} else {
if (!_obj || disabled || !_isDraggable) return;
origValue=value;
getPosition();
updateValue();
if (snapsOnIncorrect && value && c[value].isCorrect == false) {
c[value].selected = false; // turn off selected flag
noJudge=true;
} else if (snapsOnMiss && !value) {
noJudge=true;
}
if (noJudge) {
snapBack();
if (origValue) {
c[origValue].selected = true;
value = origValue;
}
if (this.onDrag != null) onDrag(_parent._self+_name, _posX, _posY);
if (this.onDrop != null) onDrop(_parent._self+_name, value);
}
if (!noJudge) updateSources();
// call the parent's update
_parent.update(noJudge);
} }
}
//Gets the current position of the layer
function MM_dragGetPosition() {
if (this._obj) with (this) {
_prevPosX = _posX; _prevPosY = _posY;
_posX = parseInt((_parent.browserIsNS)?_obj.pageX:_obj.style.pixelLeft);
_posY = parseInt((_parent.browserIsNS)?_obj.pageY:_obj.style.pixelTop);
}
}
//Moves the layer to the given position
function MM_dragSnapTo(newPosX, newPosY) {
if (this._obj && newPosX && newPosY) with (this) {
if (_parent.browserIsNS) {
_obj.pageX = newPosX; _obj.pageY = newPosY;
} else {
_obj.style.pixelLeft = newPosX; _obj.style.pixelTop = newPosY;
}
_posX = newPosX; _posY = newPosY;
}
}
//Moves the layer to its previous position
function MM_dragSnapBack() {
with (this) snapTo(_prevPosX, _prevPosY);
}
function MM_dragMoveToFront() {
var maxZ=0, i, aLayer, aLayerZ;
with (this) {
if (document.allLayers != null) {
for (i=0; i<document.allLayers.length; i++) {
aLayer = document.allLayers[i];
aLayerZ = (_parent.browserIsNS)?aLayer.zIndex:aLayer.style.zIndex;
if (aLayerZ > maxZ) maxZ = aLayerZ;
}
eval('_obj.'+((_parent.browserIsNS)?'':'style.')+'zIndex=maxZ+1');
} }
}
//Update the value parameter and the choice selected flags
function MM_dragUpdateValue(checkOnly) {
var i;
with (this) {
value = '';
for (i in c) if (i != 'length')
if (value == '') value = c[i].validValue(checkOnly);
else c[i].validValue(checkOnly);
}
}
//Update the sources for which we are a target
function MM_dragUpdateSources() {
var i;
with (this) {
if (_isTarget) {
for (i in _parent.e) if (i != 'length') {
if (_parent.e[i].value == _name) {
if (value != i) { // update elem and choice
_parent.e[i].value = _parent.e[i].c[_name].validValue(true); // check only
} else { // dropped on the element for which we were the target
_parent.e[i].value = '';
_parent.e[i].c[_name].selected = false;
} } } }
if (this.onDrag != null) onDrag(_parent._self+_name, _posX, _posY);
if (this.onDrop != null) onDrop(_parent._self+_name, value);
}
}
//Moves the layer to the named target
function MM_dragChangeValue(theValue) {
var retVal = false;
var choice, i;
if (this._obj && theValue && this._isDraggable) with (this) {
for (choice in c) if (choice != 'length' && choice == theValue) break;
if (choice == theValue) {
c[choice].setHotSpot();
snapTo(c[choice]._hitX, c[choice]._hitY);
moveToFront();
updateValue(); // set our selected state
updateSources();
retVal = true;
} }
return retVal;
}
//Moves the layer to the named target, then updates the int
function MM_dragSetValue(theValue) {
with (this) {
if (changeValue(theValue))
_parent.update(true); // update int, but don't judge
}
}
////////////////////////////////////////
//Create a drag and drop choice object
function MM_dragTarg(theParent, theElement,
theTarget, theIsCorrect, theScore,
theTolerance, theAlignment, theOffset, theSnapsTo) {
// properties
this.expectedValue = theTarget;
this.isCorrect = theIsCorrect;
this.score = theScore;
this.selected = false;
this.disabled = false;
this.tolerance = theTolerance;
this.alignment = theAlignment;
this.snapsTo = theSnapsTo;
this.offsetX = 0;
this.offsetY = 0
this._elem = eval(theParent._self+".e['"+theElement+"']");
this._target = eval(theParent._self+".e['"+theTarget+"']");
this._isChoice = true;
this._hitX = 0;
this._hitY = 0;
this._snapX = '';
this._snapY = '';
if (theOffset != null) {
var colonPos = theOffset.indexOf(":");
if (colonPos != -1) { //if colon separated, split strings
this.offsetX = parseInt(theOffset.substring(0,colonPos));
this.offsetY = parseInt(theOffset.substring(colonPos+1,theOffset.length));
} }
// methods
this.validValue = MM_dragTargValidValue;
this.setHotSpot = MM_dragTargSetHotSpot;
this.setSelected = MM_dragTargSetSelected;
this.setDisabled = MM_dragTargSetDisabled;
}
function MM_dragTargValidValue(checkOnly) {
var retVal = '';
with (this) {
selected = false;
if (!disabled) {
setHotSpot();
// check if the value is within the tolerance of the hotspot
if ((Math.pow(_hitX-_elem._posX,2) + Math.pow(_hitY-_elem._posY,2))
<= Math.pow(tolerance,2)) {
selected = true;
if (snapsTo && !checkOnly) _elem.snapTo(_snapX, _snapY);
retVal = expectedValue;
} } }
return retVal;
}
function MM_dragTargSetHotSpot() {
var centerX, centerY, alignX=0, alignY=0;
with (this) {
// compute the center
centerX = Math.round(0.5 * (_target._width-_elem._width));
centerY = Math.round(0.5 * (_target._height-_elem._height));
// compute the alignment
if (alignment != '') {
// set to 'Center'
alignX = centerX; alignY = centerY;
if (alignment == 'Bottom') alignY = _target._height;
else if (alignment == 'Top') alignY = -_elem._height;
else if (alignment == 'Left') alignX = -_elem._width;
else if (alignment == 'Right') alignX = _target._width;
}
// update the targets position (needed for draggable targets)
_target.getPosition();
// set the snap location
_snapX = _target._posX + alignX + offsetX;
_snapY = _target._posY + alignY + offsetY;
// set the hit location
_hitX = _target._posX + centerX;
_hitY = _target._posY + centerY;
}
}
function MM_dragTargSetSelected(theSelected) {
with (this) {
if (theSelected) {
_elem.setValue(expectedValue);
} else {
selected = false;
if (_elem.value == expectedValue) _elem.value = '';
_elem._parent.update(true);
}
}
}
function MM_dragTargSetDisabled(theDisabled) {
with (this) {
disabled = theDisabled;
if (disabled) {
selected = false;
if (_elem.value == expectedValue) _elem.value = '';
} else {
// NOTE: the selected state won't be correct
// if the snap location is outside of the tolerance
if (_elem._obj) {
validValue(true);
if (selected) _elem.value = expectedValue;
}
}
_elem._parent.update(true);
}
}